package com.mall.service.impl;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import com.mall.common.Const;
import com.mall.common.ResponseCode;
import com.mall.common.ServerResponse;
import com.mall.dao.MmallCartMapper;
import com.mall.dao.MmallProductMapper;
import com.mall.pojo.MmallCart;
import com.mall.pojo.MmallProduct;
import com.mall.service.ICartService;
import com.mall.util.BigDecimalUtil;
import com.mall.util.PropertiesUtil;
import com.mall.vo.CartProductVo;
import com.mall.vo.CartVo;

@Service
public class CartServiceImpl implements ICartService {
	
	@Autowired
	private MmallCartMapper cartMapper;
	@Autowired
	private MmallProductMapper productMapper;
	
	@Override
	public ServerResponse<CartVo> add(Integer productId,Integer userId,Integer count) {
		
		//先判断参数是否合法: productId,count
		if(productId == null || count == null){
			return ServerResponse.createByErroerCodeMessage(ResponseCode.ILLEGAL_ARGUMENT.getCode(),"请求参数不正确,请检查重试");
		}
		
		//通过productId和userId进行查询
		MmallCart cart = cartMapper.selectByProductIdAndUserId(productId,userId);
		
		//若购物车中不存在该商品,将该商品添加到购物车中
		if(cart == null){

			MmallCart carts = new MmallCart();
			//是否选择,1=已勾选,0=未勾选',
			carts.setChecked(1);
			carts.setProductId(productId);
			carts.setQuantity(count);
			carts.setUserId(userId);
			//插入
			cartMapper.insert(carts);
			
		}else{
		//购物车中存在该商品,将数量改变相应的值
			cart.setQuantity(cart.getQuantity()+count);
			cartMapper.updateByPrimaryKeySelective(cart);
		}
		
		CartVo vo = this.getCartVoLimit(userId);
		
		return ServerResponse.createBySuccess(vo);
	}
	
	
	@Override
	public ServerResponse<CartVo> update(Integer userId, Integer productId, Integer count) {
		
		if(productId == null || count == null){
			return ServerResponse.createByErroerCodeMessage(ResponseCode.ILLEGAL_ARGUMENT.getCode(),"请求参数不正确,请检查重试");
		}
		
		MmallCart cart = cartMapper.selectByProductIdAndUserId(productId, userId);
		
		if(cart != null){
			cart.setQuantity(count);
		}
		
		cartMapper.updateByPrimaryKeySelective(cart);
		CartVo vo = this.getCartVoLimit(userId);
		
		return ServerResponse.createBySuccess(vo);
		
	}
	
	@Override
	public ServerResponse<CartVo> delete(Integer userId, String productIds) {
		
		if(StringUtils.isBlank(productIds)){
			return ServerResponse.createByErroerCodeMessage(ResponseCode.ILLEGAL_ARGUMENT.getCode(), "未传参数,请修改");
		}
		
		//将productIds中的id,如 1,3 按逗号分隔,并添加到集合中.
		String[] str = productIds.split(",");
		List<String> productIdList = new ArrayList<>();
		for (String string : str) {
			productIdList.add(string);
		}
		
		if(CollectionUtils.isEmpty(productIdList)){
			return ServerResponse.createByErroerCodeMessage(ResponseCode.ILLEGAL_ARGUMENT.getCode(), "参数不正确");
		}
		
		cartMapper.deleteByUserIdProductIds(userId,productIdList);
		CartVo vo = this.getCartVoLimit(userId);
		return ServerResponse.createBySuccess(vo);
		
	}
	
	@Override	//列出购物车中所有的商品
	public ServerResponse<CartVo> list(Integer userId) {
		
		CartVo vo = this.getCartVoLimit(userId);
		
		return ServerResponse.createBySuccess(vo);
	}
	
	@Override	//全选 全不选 只选一个 只不选一个 共用一个service,一个dao
	public ServerResponse<CartVo> SelectOrUnSelect(Integer userId,Integer productId,Integer checked) {
		
		cartMapper.selectOrUnSelect(userId,productId,checked);
		
		CartVo vo = this.getCartVoLimit(userId);
		
		return ServerResponse.createBySuccess(vo);
		
	}
	
	@Override	//查询在购物车里的产品数量,按个数算,不按种类算 ,即当某种商品购物车中有10件时,商品数量就是10,而不是1
	public ServerResponse<Integer> getCartProductCount(Integer userId) {
		
		//未登录返回0
		if(userId == null){
			return ServerResponse.createBySuccess(0);
		}
		
		int count = cartMapper.selectCartProductCount(userId);
		
		return ServerResponse.createBySuccess(count);
	}
	
	
	
	
	
	//组装cartvo,同时对数量进行限制,
	private CartVo getCartVoLimit(Integer userId){
		
		CartVo vo = new CartVo();
		List<MmallCart> carts = cartMapper.selectCartByUserId(userId);
		List<CartProductVo> productVoList = new ArrayList<>();
		BigDecimal totalPrice = new BigDecimal("0");
		
		//如果用户的购物车中产品不为空
		if(!carts.isEmpty()){
			for(MmallCart cart : carts){
				
				CartProductVo productVo = new CartProductVo();
				
				//组装CartProductVo对象,设置id
				productVo.setProductId(cart.getProductId());
				productVo.setUserId(userId);
				productVo.setId(cart.getId());
				
				MmallProduct product = productMapper.selectByPrimaryKey(cart.getProductId());
				
				if(product !=null){
					//继续组装CartProductVo对象,设置关于产品的属性
					productVo.setProductName(product.getName());
					productVo.setProductSubtitle(product.getSubtitle());
					productVo.setProductMainImage(product.getMainImage());
					productVo.setProductPrice(product.getPrice());
					productVo.setProductStatus(product.getStatus());
					productVo.setProductStock(product.getStock());
					productVo.setProductChecked(cart.getChecked());
					//判断库存
					int buyLimitCount = 0;
					if(product.getStock() >= cart.getQuantity() ){
						
						//库存充足
						buyLimitCount = cart.getQuantity();
						productVo.setLimitQuantity(Const.Cart.LIMIT_NUM_SUCCESS);
						 
					}else{
						//库存不足
						buyLimitCount = product.getStock();
						productVo.setLimitQuantity(Const.Cart.LIMIT_NUM_FAIL);
						
						//购物车中更新有效库存,将购物车中某件商品的最大数量设置为库存的数量
						MmallCart nowCart = new MmallCart();
						nowCart.setId(cart.getId());
						nowCart.setQuantity(buyLimitCount);
						//更新
						cartMapper.updateByPrimaryKeySelective(nowCart);
					}
					
					//设置数量
					productVo.setQuantity(buyLimitCount);
					
					//计算并设置总价,这里计算的是一类商品的总价,
					productVo.setProductTotalPrice(BigDecimalUtil.mult(productVo.getQuantity().doubleValue(),product.getPrice().doubleValue()));
				}
				
				if(cart.getChecked()==1){
					//如果已经勾选,增加到整个购物车总价中
					totalPrice = BigDecimalUtil.add(totalPrice.doubleValue(),productVo.getProductTotalPrice().doubleValue());
				}
				
				productVoList.add(productVo);
			} 
		}
		
		vo.setCartTotalPrice(totalPrice);
		vo.setCartProductVo(productVoList);
		vo.setImageHost(PropertiesUtil.getProperty("ftp.server.http.prefix"));
		vo.setAllChecked(getAllChecked(userId));
		return vo;
		
	}
	
	private boolean getAllChecked(Integer userId){
		if(userId == null){
			return false;
		}
		//返回1时代表没有勾选 , 返回0代表已勾选
		return cartMapper.selectCartProductCheckedStatusByUserId(userId) == 0;
	}











	
}
